﻿using System.Collections.Generic;
using System.ComponentModel;
using SAPPDI.Entitys.Annotations;
using System.Linq;

namespace SAPPDI.Entitys
{
    public class Insertos : INotifyPropertyChanged
    {

        private int _paginas;
        public int Paginas
        {
            get
            {
                return _paginas;
            }
            set
            {
                _paginas = value;
                NotifyPropertyChanged("Paginas");
            }
        }

        private double _Gramaje;
        public double Gramaje
        {
            get
            {
                return _Gramaje;
            }
            set
            {
                _Gramaje = value;
                NotifyPropertyChanged("Gramaje");
            }
        }

        private TipoPapel _SelectedTipoPapel;
        [BindableAttribute(true)]
        public TipoPapel SelectedTipoPapel
        {
            get
            {
                return _SelectedTipoPapel;
            }
            set
            {
                _SelectedTipoPapel = new TipoPapel(value);
                if (_SelectedTipoPapel != null)
                    this.Papel = _SelectedTipoPapel.Papels!=null?_SelectedTipoPapel.Papels.Select(elemento => new Papel(elemento)).ToList():null;
                NotifyPropertyChanged("SelectedTipoPapel");
            }
        }

        private Papel _SelectedPapel;
        [BindableAttribute(true)]
        public Papel SelectedPapel
        {
            get
            {
                return _SelectedPapel;
            }
            set
            {
                _SelectedPapel =new Papel(value);
                NotifyPropertyChanged("SelectedPapel");
            }
        }

        private List<CatalogoInfo> _listaEntrePliegos;

        public List<CatalogoInfo> ListaEntrePliegos
        {
            get { return this._listaEntrePliegos; }
            set
            {
                this._listaEntrePliegos = value;
                NotifyPropertyChanged("ListaEntrePliegos");
            }
        }

        private CatalogoInfo _selectedEntrePliegos;
        [BindableAttribute(true)]
        public CatalogoInfo SelectedEntrePliegos
        {
            get
            {
                return _selectedEntrePliegos;
            }
            set
            {
                _selectedEntrePliegos = value;
                NotifyPropertyChanged("SelectedEntrePliegos");
            }
        }

        private List<Papel> _papels;

        public List<Papel> Papel
        {
            get { return this._papels; }
            set
            {
                this._papels = value != null ? value.Select(elemento => new Papel(elemento)).ToList() : null;

                NotifyPropertyChanged("Papel");
            }
        }

        private List<TipoPapel> _Tipopapels;

        public List<TipoPapel> TipoPapels
        {
            get { return this._Tipopapels; }
            set
            {
                this._Tipopapels = value!=null?value.Select(elemento=>new TipoPapel(elemento)).ToList():null;
                NotifyPropertyChanged("TipoPapels");
            }
        }

        private int _numeroInsertos;

        public int NumeroInsertos
        {
            get { return _numeroInsertos; }
            set
            {
                this._numeroInsertos = value;
                NotifyPropertyChanged("NumeroInsertos");
            }
        }

        private bool _isGramos;

        public bool IsGramos
        {
            get { return _isGramos; }
            set { this._isGramos = value;
            NotifyPropertyChanged("IsGramos");
            }
        }
        private bool _isPuntos;

        public bool IsPuntos
        {
            get { return _isPuntos; }
            set
            {
                this._isPuntos = value;
                NotifyPropertyChanged("IsPuntos");
            }
        }

        private bool _isSuleto;

        public bool IsSuelto
        {
            get { return _isSuleto; }
            set
            {
                this._isSuleto = value;
                NotifyPropertyChanged("IsSuelto");
            }
        }


        private bool _is4x4;

        public bool Is4x4
        {
            get { return _is4x4; }
            set
            {
                this._is4x4 = value;
                NotifyPropertyChanged("Is4x4");
            }
        }

        private bool _is1x1;

        public bool Is1x1
        {
            get { return _is1x1; }
            set
            {
                this._is1x1 = value;
                NotifyPropertyChanged("Is1x1");
            }
        }
        private bool _is4x1;

        public bool Is4x1
        {
            get { return _is4x1; }
            set
            {
                this._is4x1 = value;
                NotifyPropertyChanged("Is4x1");
            }
        }
        private bool _is1x0;

        public bool Is1x0
        {
            get { return _is1x0; }
            set
            {
                this._is1x0 = value;
                NotifyPropertyChanged("Is1x0");
            }
        }
        private bool _is4x0;

        public bool Is4x0
        {
            get { return _is4x0; }
            set
            {
                this._is4x0 = value;
                NotifyPropertyChanged("Is4x0");
            }
        }
        private bool _isOtros;

        public bool IsOtros
        {
            get { return _isOtros; }
            set
            {
                this._isOtros = value;
                NotifyPropertyChanged("IsOtros");
            }
        }


        private int _tintaUno;

        public int TintaUno
        {
            get { return _tintaUno; }
            set
            {
                this._tintaUno = value;
                NotifyPropertyChanged("TintaUno");
            }
        }


        private int _tintaDos;

        public int TintaDos
        {
            get { return _tintaDos; }
            set
            {
                this._tintaDos = value;
                NotifyPropertyChanged("TintaDos");
            }
        }
        private bool _isSujeto;

        public bool IsSujeto
        {
            get { return _isSujeto; }
            set
            {
                this._isSujeto = value;
                NotifyPropertyChanged("IsSujeto");
            }
        }

        public string GetTintas()
        {
            if (this.Is1x0)
            {
                return "1x0";
            }
            if (this.Is1x1)
            {
                return "1x1";
            }
            if (this.Is4x0)
            {
                return "4x0";
            }
            if (this.Is4x1)
            {
                return "4x1";
            }
            if (this.Is4x4)
            {
                return "4x4";
            }
            if (this.IsOtros)
            {
                return this.TintaUno.ToString() + "x" + this.TintaDos.ToString();
            }
            return string.Empty;
        }

        public Insertos()
        {
            this._isGramos = true;
            this._isSujeto = true;
            this._is4x4 = true;
        }

        public Insertos(Insertos elemento)
        {
            this._Gramaje = elemento.Gramaje;
           
            this._Tipopapels=new List<TipoPapel>();
            if (elemento.TipoPapels != null)
            {
                foreach (var tipoPapel in elemento.TipoPapels)
                {
                    this._Tipopapels.Add(new TipoPapel(tipoPapel));
                }
            }
            this._paginas = elemento.Paginas;
            this._is1x0 = elemento.Is1x0;
            this._is1x1 = elemento.Is1x1;
            this._is4x0 = elemento.Is4x0;
            this._is4x1 = elemento.Is4x1;
            this._is4x4 = elemento.Is4x4;
            this._isGramos = elemento.IsGramos;
            this._isOtros = elemento.IsOtros;
            this._isPuntos = elemento.IsPuntos;
            this._isSujeto = elemento.IsSujeto;
            this._isSuleto = elemento.IsSuelto;
            this._numeroInsertos = elemento.NumeroInsertos;
            this._papels= new List<Papel>();
            if (elemento.Papel != null)
            {
                foreach (var papel in elemento.Papel)
                {
                    this._papels.Add(new Papel(papel));
                }
            }
            this._SelectedTipoPapel = new TipoPapel(elemento.SelectedTipoPapel);
            this._SelectedPapel = new Papel( elemento.SelectedPapel);
            this._listaEntrePliegos=new List<CatalogoInfo>();
            if (elemento.ListaEntrePliegos != null)
            {
                foreach (var entrePliego in ListaEntrePliegos)
                {
                    this._listaEntrePliegos.Add(new CatalogoInfo(entrePliego));
                }
            }
            this.SelectedEntrePliegos=new CatalogoInfo(elemento.SelectedEntrePliegos);
            this._tintaDos = elemento._tintaDos;
            this._tintaUno = elemento._tintaUno;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void NotifyPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

        public void ColocaNuevosValores(Insertos elemento)
        {
            this.Gramaje = elemento.Gramaje;
            this.Paginas = elemento.Paginas;
            this.Is1x0 = elemento.Is1x0;
            this.Is1x1 = elemento.Is1x1;
            this.Is4x0 = elemento.Is4x0;
            this.Is4x1 = elemento.Is4x1;
            this.Is4x4 = elemento.Is4x4;
            this.IsGramos = elemento.IsGramos;
            this.IsOtros = elemento.IsOtros;
            this.IsPuntos = elemento.IsPuntos;
            this.IsSujeto = elemento.IsSujeto;
            this.IsSuelto = elemento.IsSuelto;
            this.NumeroInsertos = elemento.NumeroInsertos;
            this.SelectedTipoPapel = null;
            if (this.TipoPapels == null)
            {
                this.TipoPapels = new List<TipoPapel>();
            }
            else
            {
                this.TipoPapels.Clear();
            }
            if (elemento.TipoPapels != null)
            {
                foreach (var tipoPapel in elemento.TipoPapels)
                {
                    this.TipoPapels.Add(new TipoPapel(tipoPapel));
                }
            }
            this.SelectedPapel = null;
            if (this.Papel == null)
            {
                this.Papel = new List<Papel>();
            }
            else
            {
                this.Papel.Clear();
            }
            if (elemento.Papel != null)
            {
                foreach (var papel in elemento.Papel)
                {
                    this.Papel.Add(new Papel(papel));
                }
            }
            this.SelectedEntrePliegos = null;
            if (this.ListaEntrePliegos == null)
            {
                this.ListaEntrePliegos=new List<CatalogoInfo>();
            }
            else
            {
                this.ListaEntrePliegos.Clear();
            }
            if (elemento.ListaEntrePliegos != null)
            {
                foreach (var listaEntrePliego in elemento.ListaEntrePliegos)
                {
                    this.ListaEntrePliegos.Add(new CatalogoInfo(listaEntrePliego));
                }
            }
            this.SelectedTipoPapel = new TipoPapel(elemento.SelectedTipoPapel);
            this.SelectedPapel = new Papel(elemento.SelectedPapel);
            this.SelectedEntrePliegos=new CatalogoInfo(elemento.SelectedEntrePliegos);
            this.TintaDos = elemento.TintaDos;
            this.TintaUno = elemento.TintaUno;

        }
    }
}
